﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Excecoes;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using NUnit.Framework;

namespace LM.TesteUnitario
{
    [TestFixture]
    class TesteServicoDeDependente
    {
        private IServicoDeDependente _servicoDeDependente;

        [SetUp]
        public void SetUp()
        {
            _servicoDeDependente = FabricaGenerica.Crie<IServicoDeDependente>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoDependente = new DtoDependente { Codigo = 999, Nome = "Teste", Cnh = "12165415135", Cpf = "163415132"};

            _servicoDeDependente.Cadastre(dtoDependente);
        }

        private void LimpeDados()
        {
            var Dependente = _servicoDeDependente.Consulte(999);
            if (Dependente != null)
            {
                _servicoDeDependente.Exclua(Dependente.Codigo);
            }
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoDependente = new DtoDependente { Codigo = 1, Cnh = "", Nome = "", Cpf = ""};

            _servicoDeDependente.Cadastre(dtoDependente);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();
            const string novoNome = "Teste";

            var Dependente = _servicoDeDependente.Consulte(999);
            Dependente.Nome = novoNome;
            _servicoDeDependente.Atualize(Dependente);

            Dependente = _servicoDeDependente.Consulte(999);
            Assert.AreEqual(novoNome, Dependente.Nome);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var Dependente = _servicoDeDependente.Consulte(999);
            Assert.IsNotNull(Dependente);
            Assert.AreEqual(999, Dependente.Codigo);

            _servicoDeDependente.Exclua(999);
            Dependente = _servicoDeDependente.Consulte(999);

            Assert.IsNull(Dependente);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoDeDependente>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoDeDependente>().Cadastre(new DtoDependente
            {
                Codigo = 999,
                Nome = "Marcius",
                Cnh = "1111111",
                Cpf = "2222222"
            });
        }
    }
}
